首页/版本发布/Node.js v22更新日志

正文

2024年04月25日,Node.js v22 版本正式发布了,让我们来看看这个版本的更新内容吧~

ESM:放弃对导入断言的支持

用过 assets 没?它的写法是这样的。

import data from './data.json' assert { type: 'json' };

使用 asset 来指定导入资源的类型。

那么在 CommonJS 时代,导入 js 和导入 json 都不用特意区分的。

const data = require("./data.json");

本次的 Node.js v22 版本发布后,asset 被废弃了。

那么我要使用 import 导入 json 文件,该怎么做呢?

其实很简单,把 assets 换成 with 即可。

import data from "./data.json" with { type: "json" };

Chrome 浏览器也将会在 v126 版本,讲 asset 语法移除,请大家注意,根据自身情况调整。

内置测试框架被标记为稳定

用一个图来说明下。

picture 0

图片来源:@liran_tal

也就是说,v22 版本以前,你要做测试用例时需要安装红色部分的一大堆依赖。

这个版本以后,红色部分都可以删掉了,只需要图中 3 行绿色代码即可。

不得不说,Node.js 真是越来越好用了。

默认启用 WebSocket 客户端

v22 以前的版本

console.log(WebSocket);

得到:

console.log(WebSocket);
            ^

ReferenceError: WebSocket is not defined
    at file:///D:/codes/yicode.tech/labs/test.js:1:13
    at ModuleJob.run (node:internal/modules/esm/module_job:222:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:323:24)
    at async loadESM (node:internal/process/esm_loader:28:7)
    at async handleMainPromise (node:internal/modules/run_main:113:12)

Node.js v20.12.1

v22 版本以后,得到:

[class WebSocket extends EventTarget] {
  CONNECTING: 0,
  OPEN: 1,
  CLOSING: 2,
  CLOSED: 3
}

require 可以导入 esm 模块了

官方的 ESM 规范发布以来,以前的语法 require 导入 esm 包的问题一直处于争论中。

那么 v22 版本后,这个问题已经解决了一部分,现在可以使用 require 去导入 esm 模块了。

esm 文件:

// point.mjs
export function distance(a, b) {
    return (b.x - a.x) ** 2 + (b.y - a.y) ** 2;
}
class Point {
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }
}
export default Point;

require 导入 esm 文件:

// main.js
const required = require("./point.mjs");
// [Module: null prototype] {
//   default: [class Point],
//   distance: [Function: distance]
// }
console.log(required);

(async () => {
    const imported = await import("./point.mjs");
    console.log(imported === required); // true
})();

fs 新增 glob 和 globSync 方法

难道是跟 Bun 学的?

在 v22 版本以前,我们要获取某个目录所有以 .js 结尾的文件,那么我们要么获取全部文件,然后遍历过滤。

要么使用第三方库,比如 fast-glob 处理。

那么在 v22 版本以后,可以直接使用 fs.globfs.globSync 来实现这个功能了。

import { glob } from "node:fs/promises";

for await (const entry of glob("**/*.js")) {
    console.log(entry);
}

Node.js 的一小步,好用了一大截。

随易总结

Node.js v22 版本的更新,真的是下血本了。

几个重要的,实验性的功能都标记为稳定版了。

期待 Node.js 越来越好。